package com.brillilab.service.core.user.impl;

import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.brillilab.common.entity.PageVo;
import com.brillilab.dao.mapper.user.UserInviteAuditMapper;
import com.brillilab.domain.po.lab.Lab;
import com.brillilab.domain.po.user.UserInviteAudit;
import com.brillilab.domain.po.user.Users;
import com.brillilab.domain.vo.user.UserInviteAuditVo;
import com.brillilab.service.core.lab.ILabService;
import com.brillilab.service.core.user.IUserInviteAuditService;
import com.brillilab.service.logic.user.UsersLogic;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 用户邀请审核表 服务实现类
 * </p>
 *
 * @author zlb
 * @since 2019-06-26
 */
@Service
@Transactional
public class UserInviteAuditServiceImpl extends ServiceImpl<UserInviteAuditMapper, UserInviteAudit> implements IUserInviteAuditService {
    @Resource
    private UserInviteAuditMapper userInviteAuditMapper;

    @Resource
    private ILabService labService;

    @Resource
    private UsersLogic usersLogic;

    @Override
    public UserInviteAudit insert(UserInviteAudit labApply) {
        Integer b = userInviteAuditMapper.insert(labApply);
        return b==1 ? labApply: null;
    }

    @Override
    public UserInviteAudit selectById(Long id) {
        return userInviteAuditMapper.selectById(id);
    }

    @Override
    public List<UserInviteAudit> selectListByState(Integer state) {
        LambdaQueryWrapper<UserInviteAudit> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserInviteAudit::getState, state);
        return userInviteAuditMapper.selectList(wrapper);
    }

    @Override
    public PageVo<UserInviteAudit> selectPageVo(Page<UserInviteAudit> page, Wrapper<UserInviteAudit> wrapper) {
        IPage<UserInviteAudit> iPage = userInviteAuditMapper.selectPage(page, wrapper);
        return new PageVo<UserInviteAudit>(iPage);
    }

    @Override
    public UserInviteAudit selectUser(String mobile, Integer state) {
        LambdaQueryWrapper<UserInviteAudit> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserInviteAudit::getMobile, mobile);
        if (state != null) {
            wrapper.eq(UserInviteAudit::getState, state);
        }
        return userInviteAuditMapper.selectOne(wrapper);
    }

    @Override
    public PageVo<UserInviteAudit> selectByState(Integer applyState,int pageNum, int pageSize) {
        IPage<UserInviteAudit> page = new Page<>(pageNum, pageSize);
        LambdaQueryWrapper<UserInviteAudit> queryWrapper = new LambdaQueryWrapper<>();
        if(applyState != null){
            queryWrapper.eq(UserInviteAudit::getState, applyState);
        }
        IPage<UserInviteAudit> iPage = userInviteAuditMapper.selectPage(page, queryWrapper);
        return new PageVo<UserInviteAudit>(iPage);
    }

    @Override
    public PageVo<UserInviteAuditVo> selectToState(Integer applyState, String mobile, int pageNum, int pageSize) {
        IPage<UserInviteAudit> page = new Page<>(pageNum, pageSize);
        LambdaQueryWrapper<UserInviteAudit> queryWrapper = new LambdaQueryWrapper<>();
        if(applyState!=null) {
            queryWrapper.eq(UserInviteAudit::getState, applyState);
        }
        if(!StringUtils.isEmpty(mobile)) {
            queryWrapper.eq(UserInviteAudit::getMobile, mobile);
        }
        queryWrapper.gt(UserInviteAudit::getInviteState,0); //过滤邀请注册尚未提交申请的数据
        IPage<UserInviteAudit> iPage = userInviteAuditMapper.selectPage(page, queryWrapper);

        PageVo<UserInviteAuditVo> userInviteAuditVoPageVo = new PageVo<>();

        if (iPage != null && iPage.getRecords() != null && iPage.getRecords().size() > 0) {
            List<UserInviteAuditVo> auditList=new ArrayList<>();
            List<Long> labIdList=iPage.getRecords().stream().map(p->p.getLabId()).collect(Collectors.toList());

            List<Lab> labList=labService.selectListByIdList(labIdList);
            List<Long> ownerIdList = labList.stream().map(p -> p.getOwnerId()).collect(Collectors.toList());
            List<Users> userList = usersLogic.getUserList(ownerIdList);
            UserInviteAuditVo auditVo=null;
            for (UserInviteAudit audit : iPage.getRecords()) {
                auditVo=new UserInviteAuditVo();
                BeanUtils.copyProperties(audit,auditVo);
                Lab lab = labList.stream().filter(p->p.getId().equals(audit.getLabId())).findAny().orElse(null);
                if(lab!=null) {
                    //机构单位
                    auditVo.setOrgName(lab.getOrgName());
                    //二级机构
                    auditVo.setSecOrgName(lab.getAcademy());
                    Users users = userList.stream().filter(p->p.getId().equals(lab.getOwnerId())).findAny().orElse(null);
                    if(users!=null) {
                        //PI姓名
                        auditVo.setPiName(users.getName());
                    }
                }
                auditList.add(auditVo);
            }
            userInviteAuditVoPageVo.setContent(auditList);
            userInviteAuditVoPageVo.setPageNum(pageNum);
            userInviteAuditVoPageVo.setPageSize(pageSize);
            userInviteAuditVoPageVo.setTotalPage((int)iPage.getPages());
            userInviteAuditVoPageVo.setTotalRow((int) iPage.getTotal());
        }

        return userInviteAuditVoPageVo;
    }

    @Override
    public UserInviteAudit selectFirstAuditPassOne(Long labId,String mobile) {
        return userInviteAuditMapper.selectFirstAuditPassOne(labId,mobile);
    }

    @Override
    public List<UserInviteAudit> selectList(Long labId, String mobile) {
        LambdaQueryWrapper<UserInviteAudit> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(UserInviteAudit::getLabId,labId);
        queryWrapper.eq(UserInviteAudit::getMobile,mobile);
        return userInviteAuditMapper.selectList(queryWrapper);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<UserInviteAudit> selectListByMobile(String mobile,boolean isAsc) {
        return userInviteAuditMapper.selectList(
                new LambdaQueryWrapper<UserInviteAudit>()
                        .eq(UserInviteAudit::getMobile,mobile)
                        .orderByAsc(isAsc,UserInviteAudit::getUpdateTime));
    }

    @Override
    public UserInviteAudit selectByLabIdAndMobile(Long labId, String mobile) {
        LambdaQueryWrapper<UserInviteAudit> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserInviteAudit::getLabId,labId);
        wrapper.eq(UserInviteAudit::getMobile, mobile);
        wrapper.orderByAsc(UserInviteAudit::getId);
        List<UserInviteAudit> userInviteAuditList = userInviteAuditMapper.selectList(wrapper);
        if(!CollectionUtils.isEmpty(userInviteAuditList)){
            return userInviteAuditList.get(0);
        }
        return null;
    }
}
